package com.millstein.tsinglog.controller;

import com.millstein.tsinglog.annotation.ResponseResult;
import com.millstein.tsinglog.annotation.ShiroAccessLog;
import com.millstein.tsinglog.model.dto.tag.TagSaveDTO;
import com.millstein.tsinglog.model.pojo.Tag;
import com.millstein.tsinglog.model.vo.biz.TagVo;
import com.millstein.tsinglog.model.vo.result.PageResult;
import com.millstein.tsinglog.service.TagService;
import org.apache.shiro.authz.annotation.Logical;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.List;

@RestController
@RequestMapping("/tag")
@ResponseResult
@CrossOrigin
public class TagController {

    @Autowired
    private TagService tagService;

    /**
     * 分页并条件查询标签的信息
     * @param currentPage 当前页
     * @param pageSize 每页的数据量
     * @param keyword 搜索关键字
     * @param cid 按照分类搜索标签
     * @return
     */
    @GetMapping("/getTagByPage")
    @RequiresPermissions("tag:query")
    @ShiroAccessLog("查询标签信息")
    public PageResult<TagVo> getTagByPage(Integer currentPage,
                                          Integer pageSize,
                                          String keyword,
                                          Long cid) {
        return tagService.getTagByPage(currentPage, pageSize, keyword, cid);
    }

    /**
     * 根据分类查询启用状态的标签信息，不分页
     * @param cid 分类id
     * @return
     */
    @GetMapping("/getTagByCid")
    @RequiresPermissions(value = {"category:update", "article:insert", "article:update"}, logical = Logical.OR)
    public List<Tag> getTagByCid(Long cid) {
        return tagService.getTagByCid(cid);
    }

    /**
     * 新增标签
     * @param tagSaveDTO 需要新增的标签的信息
     * @return
     */
    @PostMapping("/insertTag")
    @RequiresPermissions("tag:insert")
    @ShiroAccessLog("新增标签信息")
    public void insertTag(@Valid @RequestBody TagSaveDTO tagSaveDTO) {
        tagService.insertTag(tagSaveDTO);
    }

    /**
     * 修改标签
     * @param tagSaveDTO 需要修改的标签的信息
     * @return
     */
    @PostMapping("/updateTag")
    @RequiresPermissions("tag:update")
    @ShiroAccessLog("修改标签信息")
    public void updateTag(@Valid @RequestBody TagSaveDTO tagSaveDTO) {
        tagService.updateTag(tagSaveDTO);
    }

    /**
     * 修改标签的启用状态
     * @param id 标签id
     * @param usable 是否启用，1启用，0不启用
     * @return
     */
    @GetMapping("/changeUsable")
    @RequiresPermissions("tag:update")
    @ShiroAccessLog("修改标签的启用状态")
    public void changeUsable(Long id, Short usable) {
        tagService.changeUsable(id, usable);
    }

    /**
     * 根据ids批量删除标签
     * @param ids 存放id的集合
     * @return
     */
    @GetMapping("/deleteByIds")
    @RequiresPermissions("tag:delete")
    @ShiroAccessLog("删除标签信息")
    public void deleteByIds(@RequestParam("ids") List<Long> ids) {
        tagService.deleteByIds(ids);
    }

    /**
     * 根据id查询标签信息
     * @param id 标签id
     * @return
     */
    @GetMapping("/getTagById")
    @RequiresPermissions("tag:update")
    public Tag getTagById(Long id) {
        return tagService.getTagById(id);
    }
}
